package sv.com.renacempleo.dao.red;

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Vector;

import org.apache.commons.lang.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;

import sv.com.renacempleo.dao.BaseDaoImpl;
import sv.com.renacempleo.dto.red.RedEmpresaSucursales;
import sv.com.renacempleo.dto.red.RedEmpresas;
import sv.com.renacempleo.dto.red.RedEmpresasContactos;
import sv.com.renacempleo.exception.WebException;
import sv.com.renacempleo.web.security.CustomUser;
import sv.com.renacempleo.web.util.WebUtilidades;

public class RedEmpresasDaoImpl extends BaseDaoImpl implements RedEmpresasDao{

	@SuppressWarnings("unchecked")
	@Override
	public List<Object[]> findAllActivesAsArray() throws WebException {
		DetachedCriteria criteria = DetachedCriteria.forClass(RedEmpresas.class);
		criteria.addOrder(Order.asc("redEmpresaFolio"));
		criteria.add(Restrictions.eq("redEmpresaEstado", "1"));
		criteria.setProjection(Projections.projectionList().
			add(Projections.property("redEmpresaFolio")).
			add(Projections.property("redEmpresaNombreComercial"))
		);		
		return (List<Object[]>) findByCriteria(criteria);
	}

	@Override
	public List<Object[]> findAllInactivesAsArray() throws WebException {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<Object[]> findAllAsArray() throws WebException {
		// TODO Auto-generated method stub\
		return null;
	}

	@Override
	public List<Object[]> findEmpresaByOficina(Long ctgOficinaId)
			throws WebException {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<Object[]> findEmpresaByAgente(Long ctgEmpleadoId)
			throws WebException {
		// TODO Auto-generated method stub
		return null;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Object[]> findEmpresaByNit(String redEmpresaNit)
			throws WebException {
		DetachedCriteria criteria = DetachedCriteria.forClass(RedEmpresas.class);
		criteria.add(Restrictions.eq("redEmpresaNit", redEmpresaNit));
		return (List<Object[]>) findByCriteria(criteria);
	}

	@Override
	public List<Object[]> findEmpresaByRegistro(String redEmpresaRegistro)
			throws WebException {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<Object[]> findEmpresaByFolio(Long redEmpresaFolio)
			throws WebException {
		// TODO Auto-generated method stub
		return null;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Object[]> findEmpresaByCriterios(int opcion, String estado,
			String nombreComercial,CustomUser cu, Long redEmpresaFolio) throws WebException {
		Vector<Object> parameters = new Vector<Object>();
		String sqlQuery = WebUtilidades.getQueryByName("redEmpresas.findEmpresas");
		String where = "";
		switch (opcion) {
			case 1: //EMPRESAS REGISTRADAS POR EL USUARIO
				where += " SGD_USU_ID = ?";
				parameters.add(cu.getSgdUsuarioId());
				break;
			case 2: //EMPRESAS REGISTRADAS A LA OFICINA QUE PERTENECE EL USUARIO
				where += "CTG_OFI_ID = ?";
				parameters.add(cu.getCtgOficinaId());
				break;
			default:
				break;
			
		}
		if(StringUtils.isNotBlank(nombreComercial) && opcion != 3){ //25-09-2012 Agregado por Ricardo Ardon, Filtros para cumplir condicion si no es estado 3
			where += " AND RED_EMP_NOMBRE_COMERCIAL ILIKE ? "; //25-09-2012 Agregado por Marlon Andrade, Filtros para busqueda por ILIKE para comodines
			parameters.add("%"+nombreComercial+"%");
		}
		if(!"".equals(estado) && opcion != 3) {
			where += " AND RED_EMP_ESTADO = ?";
			parameters.add(estado);
		}else {
			where += " RED_EMP_ESTADO = ?";
			parameters.add(estado);
			if(StringUtils.isNotBlank(nombreComercial)){ //25-09-2012 Agregado por Ricardo Ardon, Filtros para busqueda
				where += " AND RED_EMP_NOMBRE_COMERCIAL ILIKE ? "; //25-09-2012 Agregado por Ricardo Ardon, Filtros para busqueda
				parameters.add("%"+nombreComercial+"%");
			}
			
		}
		
		sqlQuery = StringUtils.replace(sqlQuery, "{WHERE}", StringUtils.isNotBlank(where) ? (" where " + where) : "");
		
		try {
			return (List<Object[]>) findBySQLQuery(sqlQuery, parameters.toArray());
		} catch (Exception e) {
			throw new WebException("Problemas al ejecutar la busqueda de empresas");
		}
	}

	@SuppressWarnings("unchecked")
	@Override
	public Map<String, Object> findByIdAsMap(Long redEmpresaFolio)
			throws WebException {
		String hqlQuery = WebUtilidades.getQueryByName("redEmpresa.findById");
		if(redEmpresaFolio == null) redEmpresaFolio = 0L;
		try {
			List<Object[]> list = (List<Object[]>) findByHQLQuery(hqlQuery, new Object[]{redEmpresaFolio});
			if(WebUtilidades.isEmptyList(list)) return null;
			return toMap(list.get(0), new String[]{
				"redEmpresaFolio",
				"redEmpresaFechaRegistro",
				"ctgOficinaId",
				"sgdUsuarioId",
				"ctgEmpleadoId",
				"redEmpresaNit",
				"redEmpresaRegistro",
				"redEmpresaRazonSocial",
				"redEmpresaNombreComercial",
				"redEmpresaNumeroPatronal",
				"redEmpresaDireccion",
				"redEmpresaPersoneria",
				"redEmpresaOrigen",
				"redEmpresaTotalEmpleados",
				"redEmpresaTotalHombres",
				"redEmpresaTotalMujeres",
				"redEmpresaAdultoMayores",
				"redEmpresaMenoresEdad",
				"redEmpresaDiscapacitados",
				"ctgMunicipioId",
				"redEmpresaZona",
				"redEmpresaTelefono1",
				"redEmpresaTelefono2",
				"redEmpresaFax",
				"redEmpresaEmail",
				"redEmpresaEstado",
				"redEmpresaActividadEconomica",
				"ctgMotivoBajaId"
			});
		} catch (Exception e) {
			logger.error(e, e);
			throw new WebException("Problemas a tratar de obtener la informaci\u00F3n");
		}
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Object[]> findRedMediosBusquedaByRedEmpresaFolio(
			Long redEmpresaFolio) {
		String hqlQuery = WebUtilidades.getQueryByName("redEmpresaMedioBusqueda.findAllByRedEmpresaFolio");
		if(redEmpresaFolio == null) redEmpresaFolio = 0L;
		try {
			return (List<Object[]>) findByHQLQuery(hqlQuery, new Object[]{redEmpresaFolio});
		} catch (WebException e) {
			logger.error(e, e);
		}
		return Collections.emptyList();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Object> findRedEmpresaSucursalByRedEmpresaFolio(
			Long redEmpresaFolio) throws WebException {
		DetachedCriteria criteria = DetachedCriteria.forClass(RedEmpresaSucursales.class);
		criteria.add(Restrictions.eq("redEmpresaFolio.redEmpresaFolio", redEmpresaFolio));
		criteria.createAlias("ctgDepartamento", "ctgDepartamento", Criteria.LEFT_JOIN);
		criteria.createAlias("ctgMunicipio", "ctgMunicipio", Criteria.LEFT_JOIN);
		criteria.setProjection(Projections.projectionList()
			.add(Projections.property("redEmpresaSucursalId"))
			.add(Projections.property("redEmpresaSucursalNombre"))
			.add(Projections.property("redEmpresaSucursalDireccion"))
			.add(Projections.property("redEmpresaSucursalTelefono"))
			.add(Projections.property("redEmpresaSucursaFax"))
			.add(Projections.property("redEmpresaSucursalEmail"))
			.add(Projections.property("redEmpresaSucursalCentral"))
			.add(Projections.property("ctgDepartamento.ctgDepartamentoId"))
			.add(Projections.property("ctgDepartamento.ctgDepartamentoNombre"))
			.add(Projections.property("ctgMunicipio.ctgMunicipioId"))
			.add(Projections.property("ctgMunicipio.ctgMunicipioNombre"))
		);
		criteria.addOrder(Order.asc("redEmpresaSucursalId"));
		try {
			return (List<Object>) findByCriteria(criteria);
		} catch (WebException e) {
			logger.error(e, e);
		}
		return Collections.emptyList();

	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Object> findRedEmpresaContactoByRedEmpresaFolio(
			Long redEmpresaFolio) throws WebException {
		DetachedCriteria criteria = DetachedCriteria.forClass(RedEmpresasContactos.class);
		criteria.add(Restrictions.eq("redEmpresas.redEmpresaFolio", redEmpresaFolio));
		criteria.createAlias("redEmpresaSucursal", "redEmpresaSucursal", Criteria.LEFT_JOIN);
		criteria.setProjection(Projections.projectionList()
				.add(Projections.property("redEmpresaContactoId"))
				.add(Projections.property("redEmpresaContactoNombre"))
				.add(Projections.property("redEmpresaContactoApellidos"))
				.add(Projections.property("redEmpresaContactoPuesto"))
				.add(Projections.property("redEmpresaContactoTelefono"))
				.add(Projections.property("redEmpresaContactoCelular"))
				.add(Projections.property("redEmpresaContactoEmail"))
				.add(Projections.property("redEmpresaSucursal.redEmpresaSucursalId"))
				.add(Projections.property("redEmpresaSucursal.redEmpresaSucursalNombre"))
		);
		criteria.addOrder(Order.asc("redEmpresaContactoId"));
		try {
			return (List<Object>) findByCriteria(criteria);
		} catch (WebException e) {
			logger.error(e, e);
		}
		return Collections.emptyList();
	}

}
